package com.itlong.cloud.operate.dao;

import com.itlong.cloud.POJO.DTO.operate.OperateProjectRelatedProductSaveDTO;
import com.itlong.cloud.POJO.PO.*;
import com.itlong.cloud.POJO.VO.operate.*;
import com.itlong.cloud.POJO.VO.property.PropertyRoleProjectGetVO;
import com.itlong.cloud.POJO.VO.property.PropertyTreeMenuVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      项目信息数据访问接口
 * </desc>
 *
 * @createDate 2017-10-10.
 */
@Mapper
@Repository
public interface IOperateProjectDao extends IAbstractBaseDao<ProjectPO> {

     /**
      * <desc>
      *      根据项目Id判断项目是否已存在
      * <desc/>
      *
      * @param projectId 项目Id
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-12
      */
    Integer checkProjectExist(@Param("projectId")String projectId);

    /**
     * <desc>
     *      添加单个项目
     * <desc/>
     *
     * @param params 保存参数
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-12
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      更新单个项目
     * <desc/>
     *
     * @param params 更新参数
     * @return
     * @author Chunjian.G
     * @createDate 2017-10-11
     */
    Integer update(Map<String, Object> params);

     /**
      * <desc>
      *      分页查询项目简易信息列表
      * <desc/>
      *
      * @param params 查询参数
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-10
      */
    List<OperateProjectVO> getSimplePage(Map<String,Object> params);


     /**
      * <desc>
      *      获取记录数
      * <desc/>
      *
      * @param params 查询参数
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-10
      */
    Integer getCount(Map<String,Object> params);

     /**
      * <desc>
      *      获取单个项目详情
      * <desc/>
      *
      * @param projectId 项目编号
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-11
      */
    OperateProjectDetailVO getDetail(@Param("projectId")String projectId);


    /**
      * <desc>
      *      查询单个项目的关联设备
      * <desc/>
      *
      * @param projectId 项目编号
      * @return
      * @author Chunjian.G
      * @createDate 2017-10-11
      */
    List<OperateProjectRelatedProductVO> getRelatedProducts(@Param("projectId")String projectId);

    /**
    * <desc>
    *      保存项目关联设备
    * <desc/>
    * @param projectId 项目ID
    * @param products 项目关联设备列表
    * @return
    * @author Chunjian.G
    * @createDate 2017-10-13
    */
    Integer saveRelatedProducts(@Param("projectId") String projectId,
                                @Param("products") List<OperateProjectRelatedProductSaveDTO> products);

    /**
    * <desc>
    *      删除单个项目的
    * <desc/>
    *
    * @param projectId 项目ID
    * @return
    * @author Chunjian.G
    * @createDate 2017-10-13
    */
    Integer removeRelatedProducts(@Param("projectId") String projectId);


    /**
     * <desc>
     *      根据用户id查询关联的所有项目id及名称
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @aurhor Jiaqi.X
     * @createDate 2017/10/11
     */
    Map<String,Object> getEngineerProjectInfo(@Param("userId")String userId);

    /**
     * <desc>
     *      获取分配项目时的查询列表
     * </desc>
     *
     * @return
     * @author Jiaqi.X
     * @craeteDate 2017/10/11
     */
    List<OperateAllotProjectVO> getAllotProjectPage(Map<String,Object> params);

    /**
     * <desc>
     *      获取分配项目时的查询列表总数量
     * </desc>
     *
     * @return
     * @author Jiaqi.X
     * @craeteDate 2017/10/11
     */
    Integer getAllotProjectPageCount(Map<String,Object> params);

    /**
     * <desc>
     *      更改项目状态
     * <desc/>
     *
     * @param params
     * @return
     * @author zhangs
     * @createDate 2017/10/31
     */
    void updateProjectStatus(Map<String, Object> params);

    /**
     * <desc>
     *      根据国家/省份所在区域获取对应sip服务器id
     * <desc/>
     *
     * @param countryId 国家id
     * @param provinceId 省份id
     * @return
     * @author Chunjian.G
     * @createDate 2017-11-29
     */
    String getSipIdByDomain(@Param("countryId") String countryId, @Param("provinceId") String provinceId);

    /**
     * <desc>
     *      是否启用云对讲
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return 0-禁用  1-启用
     * @author shengen.T
     * @createDate 2017-11-30
     */
    Integer getIsSmartCommunity(@Param("projectId")String projectId);

    /**
     * <desc>
     *      是否启用云电梯和蓝牙电梯
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return 0-禁用  1-启用
     * @author Juguang.S
     * @createDate 2018-04-09
     */
    Map<String,Integer> getIsCloudElevator(@Param("projectId")String projectId);

    /**
     * <desc>
     *      获取项目状态：1-启用，2-禁用
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Chunjian.G
     * @createDate 2017-12-01
     */
    Integer getProjectStatus(@Param("projectId") String projectId);

    /**
     * <desc>
     *      单表-获取项目信息
     * <desc/>
     *
     * @param projectId
     * @return
     * @author Chunjian.G
     * @createDate 2017-11-30
     */
    ProjectPO getOne(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据场景Id获取用户类型
     * <desc/>
     *
     * @param sceneId 场景Id
     * @return
     * @author Juguang.S
     * @createDate 2021-04-19
     */
    List<Map<String,Object>> getUserTypeBySceneId(@Param("sceneId") String sceneId);

    /**
     * <desc>
     *      获取物业项目用户类型特殊Id
     * <desc/>
     *
     * @param projectId
     * @return
     * @author Juguang.S
     * @createDate 2021-04-12
     */
    Integer getUserTypeId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取物业项目用户类型变更前的旧数据
     * <desc/>
     *
     * @param projectId
     * @return
     * @author Juguang.S
     * @createDate 2021-04-12
     */
    List<String> getOldUserTypeId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取项目列表。
     * <desc/>
     *
     * @param  projectName 项目编号
     * @return
     * @author shengen.T
     * @createDate 2018-01-12
     */
    List<OperateProjectInfoVO> getProjectInfoList(@Param("projectName") String projectName);

    /**
     * <desc>
     *      获取某项目的所有物业管理员id
     * <desc/>
     *
     * @param projectId
     * @return
     * @author Chunjian.G
     * @createDate 2018-01-22
     */
    List<String> getPropertyUserIdsByProjectId(@Param("projectId") String projectId);


    /**
    * <desc>
    *    获取项目所在省份/自治区/直辖市名称.
    * </desc>
    *
    * @param  projectId 项目Id
    * @return 所在省份/自治区/直辖市名称
    * @author LewisLouis
    * @createDate 2018-01-27
    */
    String getProjectCityName(@Param("projectId")String projectId);

    /**
     * <desc>
     *      获取项目启用云设备状态
     * </desc>
     *
     * @param projectId 项目id
     * @param type 1云对讲 2云电梯
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/24
     */
    Integer getCloudDeviceStatus(@Param("projectId") String projectId,@Param("type") Integer type);


    /**
     * <desc>
     *      更新人脸应用信息(关联人脸库)。
     * <desc/>
     *
     * @param  appId 百度人脸库唯一Id
     * @param  projectId 项目编号
     * @param  faceScore 人脸识别率
     * @param  faceliveness 活体识别率
     * @param  status 状态
     * @return
     * @author shengen.T
     * @createDate 2018-05-09
     */
    Integer updateFaceApplyInfo(@Param("appId") String appId, @Param("projectId") String projectId, @Param("faceScore") String faceScore,
                                @Param("faceliveness") String faceliveness,@Param("status") Integer status);
     /**
      * <desc>
      *      获取项目绑定的人脸库信息。
      * <desc/>
      *
      * @param  projectId
      * @return
      * @author shengen.T
      * @createDate 2018-05-10
      */
     OperateSimpleFaceApplyInfoVO getProjectBingingFaceInfo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取该用户下是否还有启用的项目
     * <desc/>
     *
     * @param userId
     * @return
     * @author Juguang.S
     * @createDate 2018-07-20
     */
    Integer getProjectUserInfo(@Param("userId") String userId);

    /**
     * <desc>
     *      获取用户权限和项目信息相关字段，用于云电梯SDK上报设备信息变更后接口数据结构说明
     * </desc>
     *
     * @param projectId 项目id
     * @return 获取用户项目信息VO
     * @author wangzhi
     * @createDate 2019/01/21
     */
    List<PropertyRoleProjectGetVO> getRoleProjectInfo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据项目编号获取项目类型 住宅和办公。
     * <desc/>
     *
     * @param  projectId 项目编号
     * @return 项目类型
     * @author Juguang.S
     * @createDate 2019-08-14
     */
    String getProjectType(@Param("projectId") String projectId);

    /**
     * <desc>
     *      清空用户开门密码
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/03
     */
    Integer clearUserOpenPwd(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取开门方式列表及总数
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/28
     */
    List<Map<String ,Object>> getOperatePassTypeCount();

    Integer deleteByRangeDateTime(@Param("startTime") String startTime, @Param("endTime") String endTime);

    Integer insertByRangeDateTime(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * <desc>
     *      获取城市列表及总数
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/28
     */
    List<Map<String ,Object>> getOperateCityCount();

    /**
     * <desc>
     *      获取项目下的用户id
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/4/15
     */
    List<String> getProjectUsers(@Param("projectId") String projectId);

    /**
     * <desc>
     * 获取可用最小项目编号值
     * </desc>
     *
     * @return
     * @Author caoshuai
     * @createDate 2020/09/16
     */
    String getMinProjectId();


    /**
     * <desc>
     *      获取最新版本的证书编号
     * </desc>
     *
     * @return 证书信息表最大的licenseNO
     * @Author Zhu.yj
     * @createDate  2020/9/17
     */
    Integer getMaxLicenseNo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取电脑特征码详细信息
     * </desc>
     *
     * @param projectId 项目id
     * @return  特征码信息实体类
     * @Author Zhu.yj
     * @createDate  2020/9/17
     */
    LicenseUsagePO getPCInfo(@Param("projectId") String projectId);

    /**
     *<desc>
     * RobotGo调试工具获取项目下的开发者用户的 机器人设备授权状态和机器人白名单授权状态
     *</desc>
     *
     * @Author  chengshican
     * @Date   2020-09-17 17:00
     * @Param
     * @Return
     * @Exception
     *
     */
    Map<String ,Object> getRobotGoProjectWhitelistAndDeviceAuthStatusByUserId(@Param("projectId") String projectId,@Param("userId") String userId);

    /**
     * <desc>
     *      获取日志列表
     * </desc>
     *
     * @param params 参数map
     * @return 日志列表
     * @Author Zhu.yj
     * @createDate  2020/9/18
     */
    List<OperateProjectLogPageVO> getLogPage(Map<String, Object> params);

    /**
     * <desc>
     *      获取日志分页列表数量
     * </desc>
     *
     * @param params 参数map
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/18
     */
    Integer getLogPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取证书信息
     * </desc>
     *
     * @param projectId 参数map
     * @return 证书信息实体类
     * @Author Zhu.yj
     * @createDate  2020/9/18
     */
    ProjectLicensePO getLicense(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户详细信息
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/18
     */
    OperateUserInfoPO getUserInfo(@Param("userId") String userId);

    /**
     * <desc>
     *      证书授权电脑数量
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/23
     */
    Integer getPcCount(@Param("projectId") String projectId);

    /**
     * <desc>
     *      批量更新电脑特征码信息
     * </desc>
     *
     * @param list 特征码列表
     * @return 受影响行数
     * @Author Zhu.yj
     * @createDate  2020/9/24
     */
    Integer batchUpdate(List<Map<String, Object>> list);

    /**
     * <desc>
     *      批量更新物业项目人员类型表信息
     * </desc>
     *
     * @param list 特征码列表
     * @return 受影响行数
     * @Author Juguang.S
     * @createDate  2021/04/12
     */
    Integer batchUpdateByUserType(List<Map<String, Object>> list);

    /**
     * <desc>
     *      批量更新物业项目人员类型表信息
     * </desc>
     *
     * @return 受影响行数
     * @Author Juguang.S
     * @createDate  2021/04/12
     *
     **/
    Integer batchSaveByUserType(List<Map<String, Object>> params);

    /**
     * <desc>
     *      在线查询证书信息
     * </desc>
     *
     * @param params 参数map
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/25
     */
    OperateOnlineLicenseInfoVO getLicenseInfo(Map<String, Object> params);

    /**
     * <desc>
     *      根据ID获取地址
     * </desc>
     *
     * @param addressId 地址id
     * @return
     * @Author caoshuai
     * @createDate  2020/9/25
     */

    String getAddressById(@Param("addressId") String addressId);

    /**
     * <desc>
     *      根据项目ID获取地项目信息
     * </desc>
     *
     * @param projectId 项目ID
     * @return
     * @Author caoshuai
     * @createDate  2020/9/27
     */
    ProjectPO getProjectInfoById(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据项目ID获取最大证书编号
     * </desc>
     *
     * @param projectId 项目ID
     * @return
     * @Author caoshuai
     * @createDate  2020/9/27
     */
    Integer getLicenseNoByProjectId(@Param("projectId") String projectId);

    /**
     * </desc>
     * 获取证书类型
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/27
     */
    Integer getProjectLicenseType(@Param("projectId") String projectId);

    /**
     * <desc>
     *      更改特征码信息
     * </desc>
     *
     * @param params 参数map
     * @return
     * @Author Zhu.yj
     * @createDate  2020/9/27
     */
    Integer updatePcInfo(Map<String, Object> params);

    /**
     * <desc>
     *      获取所有特征码（包括被禁用的）
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/10/10
     */
    List<String> getAllPcInfo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取所有特征码详细信息(包含被禁用的)
     * </desc>
     *
     * @param params 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/10/12
     */
    List<OperateLicenseDetailVO> getAllLicenseDetailVO(Map<String, Object> params);

    /**
     * <desc>
     *      修改项目与特征码对应记录表中特征码状态
     * </desc>
     *
     * @param params 参数map
     * @return
     * @Author Zhu.yj
     * @createDate  2020/10/12
     */
    Integer updateProjectPcInfo(Map<String, Object> params);

    /**
     * <desc>
     *      获取要同步的数据
     * </desc>
     *
     * @Author Zhu.yj
     * @createDate  2020/10/13
     */
    List<Map<String, Object>> getSynchronizeData();

    /**
     * <desc>
     *      批量保存项目与特征码对应记录表数据
     * </desc>
     *

     * @Author Zhu.yj
     * @createDate  2020/10/13
     */
    Integer batchSaveProjectPcInfoRecord(List<ProjectPcInfoRecordPO> list);

    /**
     * <desc>
     *      统计项目与特征码关系表数据数量
     * </desc>
     *
     * @param
     * @return 行数
     * @Author Zhu.yj
     * @createDate  2020/10/16
     */
    Integer getProjectPcInfoRecordCount();

    /**
     * <desc>
     *      根据项目编号查询套餐ID
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2021-03-26
     */
    Map<String,Object> getPackageId(@Param("projectId")String projectId);

    /**
     * <desc>
     *      根据项目编号删除项目套餐关系
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2021-03-26
     */
    Integer deleteProjectAndPackage(@Param("projectId")String projectId);

    /**
     * <desc>
     *      套餐分配项目
     * </desc>
     *
     * @param appPackageId 套餐id
     * @param projectId 项目id
     * @param status 状态
     * @param createTime 创建时间
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/02
     */
    Integer allotPackageProject(@Param("appPackageId") String appPackageId,
                                @Param("projectId") String projectId,
                                @Param("status") Integer status,
                                @Param("createTime") Date createTime);

    Integer getCountBySceneId(@Param("sceneId") String sceneId);

    /**
     * <desc>
     *      查询该项目下的用户类型有没被关联使用
     * </desc>
     *
     * @return 受影响行数
     * @Author Juguang.S
     * @createDate  2021/04/19
     *
     **/
    Integer getPropertyUserType(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据项目编号删除该项目下的用户类型
     * </desc>
     *
     * @return 受影响行数
     * @Author Juguang.S
     * @createDate  2021/04/19
     *
     **/
    Integer deletePropertyUserTypeByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户角色组列表
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/19
     */
    List<Map<String, Object>> getUserRoleList(@RequestParam("projectId") String projectId);

    /**
     * <desc>
     *      获取楼栋单元房间列表
     * </desc>
     *
     * @param projectId 项目列表
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/19
     */
    List<PropertyTreeMenuVO> getBuildUnitRoomList(@RequestParam("projectId") String projectId);

    /**
     * <desc>
     *      根据项目编号变更蓝牙阈值
     * <desc/>
     *
     * @param projectId 项目编号
     * @param bluetoothThreshold 项目编号
     * @return
     * @Author Juguang.S
     * @createDate  2021/04/22
     */
    void updateBluetoothThresholdByProjectId(@Param("projectId") String projectId,@Param("bluetoothThreshold") Integer bluetoothThreshold);

    /**
     * <desc>
     *     根据项目场景变更房屋类型
     * <desc/>
     *
     * @param projectId 项目编号
     * @param roomType 房屋类型
     * @return
     * @Author Juguang.S
     * @createDate  2021/05/08
     */
    void updateRoomTypeByProjectId(@Param("projectId") String projectId,@Param("roomType") Integer roomType);

    /**
     * <desc>
     *      获取套餐
     * </desc>
     *
     * @param appPackageId 套餐id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/4/17
     */
    List<String> getFunctionIds(String  appPackageId);

    /**
     * <desc>
     *      获取项目绑定套餐下的菜单id列表
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/10
     */
    List<String> getFunctionByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      删除用户项目下指定的菜单
     * </desc>
     *
     * @param params 删除条件
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/10
     */
    Integer deleteUserFunctions(Map<String, Object> params);

    /**
     * <desc>
     *      批量保存角色功能
     * </desc>
     *
     * @param list
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/10
     */
    Integer batchSaveRoleFunction(List<PropertyRoleFunctionPO> list);

    /**
     * <desc>
     *     批量保存项目与任务书关联信息
     * </desc>
     *
     * @param batchParams 待保存的信息
     * @return
     * @author Juguang.S
     * @createDate 2020/11/27
     */
    Integer batchSaveProjectAssignment(List<Map<String,Object>> batchParams);

    /**
     * <desc>
     *     查询项目与任务书关联信息是否发生变化
     * </desc>
     *
     * @param paramsMap 参数
     * @return
     * @author Juguang.S
     * @createDate 2020/11/30
     */
    Integer getProjectAssignmentInfo(Map<String,Object> paramsMap);

    /**
     * <desc>
     *     逻辑删除项目与任务书关联信息
     * </desc>
     *
     * @param paramsMap 参数
     * @return
     * @author Juguang.S
     * @createDate 2020/11/30
     */
    Integer updateProjectAssignmentInfo(Map<String,Object> paramsMap);

    /**
     * <desc>
     *     查询项目下所关联的任务书信息
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/11/30
     */
    List<OperateBusinessAssignmentDataVO> getProjectAssignmentInfoList(@Param("projectId") String projectId);

    /**
     * <desc>
     *      临时获取目前数据库最大的项目编号 (只为处理预发布环境与线下平台 测试库数据不一致导致创建项目失败)
     * <desc/>
     *
     * @return
     * @author Juguang.S
     * @createDate 2021-05-19
     */
    Integer getMaxProjectId();

}
